# Title: Aceptar teclado       		        Filename: TecladoAlan.s
# Author: Garcia Perez Alan	    	        Date: 16-Marzo-2017
# Description: Aceptar tecleado
#Input:
#Output:

@TecladoAlan.s

#Captura datos y hace operaciones

@ Registros
@ r1 - Apunta a buffer
@ r2 - Temporal a digitos
@ r3 - Contador digitos
@ r4 - Multiplicador
@ r5 - Contador
@ r0 - Regreso de valor

.section .bss
.comm buffer,48 @ Reservando el buffer a 48 bytes

# Segmento de datos

.section .data
msg:
    .ascii "Ingrese Numero: "
  msgLen = .-msg
 
 .section .text
 .globl _start
 #Code Segment
 _start:
 
 mov r0, $1
 ldr r1,=msg
 ldr r2,msgLen
 mov r7, $4
 svc $0
                      @ Entrada de datos 
 mov r7,$3            @ 3 es funcion de "leer" de syscall
 mov r0,$1
 ldr r1,=buffer
 mov r2, $0x30
 svc $0
 
 ldrb r2, [r1]
 mov r3, $0
 
 pushDigits:
 stmfd sp!,{r2}   		@ Guardar digito en pila
 add r3,r3,$1    	    @ Incremeta contador
 ldrb r2,[r1,#1]! 		@ Siguiente digito
 cmp r2, $0xA     		@ Checa si presiona enter
 beq convDigits   		@ Salta a subproceso de conversion
 bne pushDigits   		@ Continuar agregando digitos
 
 convDigits:
 mov r4, $1       		@ Inicializa multiplicador
 mov r0,$0        		@ Inicializa numero
 mov r6, $0       		@ Inicializa contador

jumpBack:
ldmfd sp!,{r2} 		  	@ Saca digito de la pila  
cmp r2, $0x30     	  @ Se fija si es digito
blt error
cmp r2,$x39        		@ Verifica
blt error
sub r2,r2, $0x30  	  @ Obtiene el valor numerico
mul r2,r4,r2       		@ Multiplica por r4
add r0,r0,r2       		@ Suma a r0
add r6,r6,$1      		@ Incrementa contador
cmp r6,r3       	    @ Checa si termiamos
beq exit
mov r5,r4,lsl $3
add r4,r5,r4,lsl $1
bal jumpBack

error:
mov r0, $-1
bal exit

exit:
mov r7,$1
svc $0
.end
